Traduction du notebook Discover your Poppy Ergo Jr par Georges Saliba sous licence CC BY SA
Ce notebook qui permet à la fois d'insérer du code pour faire fonctionner le robot et de le commenter dans le même temps, va vous guider pour apprendre à programmer le Poppy Ergo Jr en Python.
A partir de maintenant, votre robot Poppy Ergo Jr est connecté à l'aide du cable RJ 45 et votre caméra est aussi connectée.
In [ ]:
%pylab inline
from __future__ import print_function
% pylab inline est une commande python qui importe les modules numpy et matplotlib. L'option inline indique que les figures Matplotlib seront insérées dans le notebook lui-même plutôt que dans une fenêtre graphique séparée. C'est la seule option possible car votre système ne dispose pas d'interface graphique. Elle exécute en particulier les deux intructions
La dernière instruction importe du module future le sous module print_function qui permet de gérer les problèmes de compatibilité avec de futures versions de Python.
Pour commencer à utiliser votre robot en Python, vous devez tout d'abord l'instancier. C'est le rôle du code suivant.
In [ ]:
from poppy.creatures import PoppyErgoJr
poppy = PoppyErgoJr()
Cela crée un objet Robot qui peut être utilisé pour accéder aux moteurs et aux capteurs. Il prend en chage toute la communication de bas niveau pour vous. Vous n'avez donc pas besoin de connaitre les détails du protocole de communication pour faire fonctionner un moteur. Les champs motors et sensors du Robot sont automatiquement synchronisés pour correspondre à l'état de leurs équivalents matériels.
In [ ]:
poppy.rest_posture.start()
Dans un Poppy Ergo Jr, le moteur est défini comme illustré ci-dessous : Image à rajouter
A partir de l'objet Robot, vous pouvez récupérer directement la liste de tous les moteurs conectés à l'aide de l'instruction construite de la manière suivante : nom_du_conteneur_de_l_objet_robot.motors
In [ ]:
poppy_ergo_jr.motors
Comme vous pouvez le constater, vous obtenez une liste de tous les moteurs de votre objet Robot.
Vous pouvez alors récupérer tous les noms des moteurs
En Python, une syntaxe possible de la boucle pour est la suivante :
for itérateur in une_liste :
*corps de la boucle pour*
In [ ]:
for m in poppy.motors:
print(m.name)
#print ("terminé")
TRAVAIL :
Les instructions répétées dans la boucle doivent avoir la même indentation ou être dans une structure qui est au même niveau d'indentation.
On peut aussi appeler chacun des moteurs par son nom (m1,m2,etc.) à l'aide l'instruction contenur_du_robot.nom_du_moteur comme dans l'exemple ci-dessous.
In [ ]:
poppy.m1
A partir de l'objet moteur vous pouvez accéder à ses divers registres. Les principaux sont :
Ils sont accessibles directement.
Syntaxe possible : nom_du_robot.nom_du_moteur.registre
In [ ]:
poppy.m1.present_position
In [ ]:
[m.present_position for m in poppy.motors]
Il est important de comprendre que "poppy.m1.present_position" est automatiquement mis à jour avec la position courante du moteur réel (à 50Hz). Comme pour les autres registres, la fréquence de mise à jour n'est pas la même et dépend de son importance. Par exemple, la température est rafraichie à 1Hz puisqu'elle ne varie pas très vite.
In [ ]:
poppy.
Au début des registres présentés précédemment, il y en a d'autres utilisés pour envoyer des instructions/commandes au robot. Par exemple, la position des moteurs est séparée en deux registres distincts.
Pour mettre un moteur dans une nouvelle position, vous pouvez écrire :
In [ ]:
poppy.m1.goal_position = 20
In [ ]:
#COMPLETER
poppy.m1.goal_position =
Dans ces exemples, le moteur tourne aussi vite que possible (c'est le fonctionnement par défaut). Vous pouvez changer la vitesse maximale du moteur qui est enregistrée dans le registre moving_speed du moteur :
In [ ]:
#COMPLETER : pour mettre le registre moving_speed du moteur m1 de votre robot poppy à 50
poppy. =50
Maintenant le moteur m1 ne peut pas aller plus vite que 50 degrés par seconde. Faites le se déplacer une nouvelle fois pour constater la différence.
In [ ]:
poppy.m1.goal_position = 90
Les principaux registres sont :
Les servo moteurs dynamixel ont deux modes :
Vous pouvez les faire passer d'un mode à l'autre en utilisant le registre compliant. Ce registre ne pouvant être associé qu'à deux valeurs, c'est un booléen qui ne peut prendre que les valeurs True et False. Vous pouvez par exemple mettre le moteur m6 en mode compliant via :
In [ ]:
poppy.m6.compliant = True
Vous pouvez normalement faire bouger ce moteur à la main. Par exemple, cela vous sera utile pour programmer votre robot par démonstration (cf. notebook correspondant).
Et le remettre en mode stiff :
In [ ]:
poppy.m6.compliant = False
Les moteurs XL-320 motors utilisés dans le Poppy Ergo Jr ont un petite LED de couleur. Vous pouvez changer sa couleur en utilisant pypot. C'est utile pour rendre votre robot plus vivant, customisé ... Chaque moteur possède un registre led auquel on peut affecter un couleur 'green', 'red' parmi les couleurs disponibles.
Comment faire pour que la led du moteur m3 du robot poppy soit verte ?
In [ ]:
In [ ]:
if (condition) :
instructions du alors
else :
instructions du sinon
suite des instructions du programme ...
C'est l'indentation qui structure le programme.
In [ ]:
import time
for m in poppy.motors:
time.sleep(0.5)
m.led = 'yellow'
time.sleep(1.0)
m.led = 'off'
Vous pouvez connaitre toutes les couleurs disponibles à l'aide la commande suivante :
In [ ]:
from pypot.dynamixel.conversion import XL320LEDColors
print(list(XL320LEDColors))
In [ ]:
import cv2
# pour utiliser la caméra
%matplotlib inline
import matplotlib.pyplot as plt
from hampy import detect_markers
# pour détecter des marqueurs
img = poppy.camera.frame
plt.imshow(img)
# Que contient le conteneur img ?
# Que signifie plt.imshow(img) par quelle autre commande peut-on le remplacer ?
Lire des capteurs se fait exactement de la même manière que lire des registres de votre robot. Vous pouvez accéder à vos capteurs via :
In [ ]:
poppy.sensors
Ici, nous avons 2 capteurs :
Vous pouvez y accéder via leur nom :
In [ ]:
poppy.camera
Vous pouvez récupérer tous les registres existants d'un capteur :
In [ ]:
poppy.camera.registers
et recupérer et afficher une image à partir de la caméra :
Les deux premières lignes suivantes permettent d'importer la bibliothèque qui gère l'image.
img est un conteneur qui contient l'image récupérée par la caméra du poppy.
La ligne 4 permet d'afficher l'image contenue dans le conteneur img.
In [ ]:
%matplotlib inline
import matplotlib.pyplot as plt
img = poppy.camera.frame
plt.imshow(img)
Comme pour les moteurs, les valeurs des capteurs sont automatiquement synchronisées en arrière plan avec le capteur physique. Si vous exécutez une nouvelle fois les instructions précédentes, vous obtiendrez une image plus récente.
In [ ]:
plt.imshow(poppy.camera.frame)
Le robot Poppy Ergo Jr intègre un jeu de comportements prédéfinis. Il peut s'agir de postures spécifiques comme la posture de repos - rest_posture utilisée au début - ou d'une danse, ...
Vous pouvez en trouver la liste exhaustive en utilisant l'instruction suivante qui liste les primitives ou comportements :
In [ ]:
[p.name for p in poppy.primitives]
Ces comportements (ou primitives en "terminologie poppy") peuvent être démarrés, arrétés, mis en pause, etc.
In [ ]:
poppy.tetris_posture.start()
Vous pouvez faire danser le Poppy Ergo Jr pendant 10 secondes :
In [ ]:
import time
poppy.dance.start()
time.sleep(10)
poppy.dance.stop()
Maintenant que vous avez appris les bases de ce que vous pouvez faire avec un Poppy Ergo Jr, il y a encore plus à découvrir :
Vous pouvez trouver d'autres exemples dans la doc ou dans le dossier notebook suivant.
In [ ]: